package com.base.cn.platform.os.entity.course.catalog;

import com.base.cn.platform.os.common.mybatis.BaseEntity;
import com.base.cn.platform.os.common.mybatis.SqlExclude;
import com.base.cn.platform.os.common.utils.StringUtils;
import com.base.cn.platform.os.entity.course.cou.Course;
import com.base.cn.platform.os.entity.course.cou.record.CoursePlayRecord;
import com.base.cn.platform.os.entity.course.material.CouMaterial;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.net.URLDecoder;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 课程目录实体
 *
 * @author s.li
 * @create 2018-04-25-19:39
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class CourseCatalog extends BaseEntity {
    /**
     * 课程ID
     */
    private BigDecimal courseId;
    /**
     * 目录名，如果首次添加是引用素材则调用素材的名字，可修改（只影响目录本身）
     */
    private String catalogName;
    /**
     * 节点类型，1章节，2节点
     */
    private Integer nodeType;
    /**
     * 素材类型key
     */
    private String materialTypeKey;
    /**
     * 素材ID
     */
    private BigDecimal materialId;
    /**
     * 模块ID
     */
    private BigDecimal mouldId;
    /**
     * 目录父ID
     */
    private BigDecimal parentId;

    /**
     * 非直播课的预计上传时间
     */
    private Date lessonTime;
    /**
     * 直播章节开始时间
     */
    private Date lessonStartTime;
    /**
     * 直播章节结束时间
     */
    private Date lessonEndTime;
    /**
     * 是否允许回放，0不允许，1允许
     */
    private Integer replay;
    /**
     * 直播回放码
     */
    private String backCode;
    /**
     * 试听 1.否 2.是
     */
    private Integer audition;
    /**
     * 试听时长 单位:s
     */
    private Integer auditionTime;
    /**
     * 章节随堂练习的考点
     */
    private String lorePointIds;
    /**
     * 随堂练习关联的试题
     */
    private String questionIds;
    /**
     * 随堂练习总分值
     */
    private Integer practice;
    /**
     * 随堂资料的json传 key(name)是资料名 value(links)是资料链接
     */
    private String datums;
    /**排序*/
    private Integer sort;
    // 评论人次
    private Integer commentCount;
    // 课程质量总分
    private Integer quality;
    // 教学质量总分
    private Integer teach;
    // 综合感受总分
    private Integer feel;


    /**
     * 直播Id
     */
    private String liveId;
    /**
     * 直播回放Id
     */
    private String playbackId;

    //目录时长 单位:秒
    private Integer videoDuration;


    /**
     * 直播回放所需参数
     */
    private String roomid;  // 直播间id
//    private String liveid;  // 直播id
    private String recordid;// 直播回放id

    @SqlExclude
    private String progress;


    //====================
    //素材对象
    private CouMaterial material;
    //子级目录
    private List<CourseCatalog> childCourseCatalogList;
    //直播节录播放状态，1正在播放，2未开始，3已过期
    private int livePlayState;
    //随堂资料数据
    private List<Map<String, String>> datumList;
    // 知识体系数据
    private Map<String, String> loresetDataMap;
    //试题列表
    private List<Map<String,Object>> questionList;
    //通过类型分成后的试题列表
    private List<List<Map<String,Object>>> layeredQuestionList;
    //播放记录
    private CoursePlayRecord coursePlayRecord;
    //目录对应的课程对象
    private Course course;
    //父级目录
    private CourseCatalog parentCatalog;
    /**老师对象*/
    private Map<String,Object> teacher;
    //随堂练习通过人数
    private  Integer  practicePassNumber;
    //总练习人数
    private  Integer  practiceHeadcount;
    //3t直播数据
    private Map<String, Object> tLiveParams;
    /**时间轴标记*/
    private String timeAxis;
    private String nowDate;
    private String courseName;
    private String courseTypeKey;
    private BigDecimal userId;
    private String parentName;
    private BigDecimal packageId;
    private String liveUserId;

    private String lessonTimeFormat;
    public List<Map<String, String>> getDatumList() {
        String _datums = this.getDatums();
        if (StringUtils.isNotEmpty(_datums)) {
            try {
                _datums = URLDecoder.decode(_datums, "utf-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
            Gson gson = new Gson();
            return gson.fromJson(_datums, new TypeToken<List<Map<String, String>>>() {
            }.getType());
        }
        return null;
    }

    /**
     * 是否可试听
     *
     * @return {@code true}可视听，否则返回{@code false}
     */
    public boolean canAudition() {
        return audition == 2;
    }
}
